
% Третья глава работы 
\chapter{Установка NAT}
\label{chap3}

\section{Ubuntu}
\label{chap3:sec1}

Данные настройки будут постоянными. Здесь и далее будет использоваться eth1, хотя можно сделать для любого.  Пусть клиент соединен с Интернетом eth0(тоже не обязательно). Так же не важно, какой тип соединения используется(ethernet, cable, wifi, dsl).

Базовая схема подключения выглядит следующим образом: PC-Client <---> PC-Gateway (ubuntu) <---> Internet

\textbf{Конфигурации сетевой карты}

Для клиента необходим статический IP адрес.

Открываем сетевой конфигурационный файл:
\begin{verbatim}
gksu /etc/network/interfaces
\end{verbatim}
Производим конфигурации(работает только для Ethernet карт, для wireless необходимо другое)
\begin{verbatim}
auto eth0
iface eth0 inet static
        address 10.8.16.1
        netmask 255.255.255.0
        broadcast 10.8.16.0
        network 10.8.16.0
\end{verbatim}

Это установит статический IP адрес для eth0 (10.8.16.1) (изменения вступают в силу только при перезагрузки). Если необходимо временное использование настроек, то:
\begin{verbatim}
sudo ifconfig eth0 10.8.16.1
\end{verbatim}
Порт пересылки включен по умолчанию. Для включения порта:
\begin{verbatim}
gsku gedit /etc/sysctl.conf
\end{verbatim}
Необходимо найти следующее:
\begin{verbatim}
#net.ipv4.conf.default.forwarding=1
\end{verbatim}
Если найдена, то исключается \#.
\begin{verbatim}
net.ipv4.conf.default.forwarding=1
\end{verbatim}

Изменения вступят в силу после перезагрузки, либо же надо использовать команду для того, что бы изменения вступили в силу сразу
\begin{verbatim}
sudo sysctl -w net.ipv4.ip_forward=1
\end{verbatim} 
Для проверки(при наличии ошибки --- игнорировании sysctl.conf) необходимо:

\begin{verbatim}
sudo sysctl net.ipv4.ip_forward
\end{verbatim} 
 и если все еще есть ошибка, то:
\begin{verbatim}
sudo gedit /etc/rc.local
\end{verbatim}
и надо добавить до exio 0 в файле следующую строку:
\begin{verbatim}
sysctl -w net.ipv4.ip_forward=1
\end{verbatim}
Далее необходимо опять перезагрузиться.

\textbf{Конфигурация IP таблицы(пакетного фильтра)}
Configuring iptables (paket filter)
Для того, что бы разрешить пакетам проходить через маршрутизатор, необходимо добавить в IP -- таблицы несколько правил фильтрации пакетов. Так же надо изменить сами пакеты, чтобы они находили путь назад.
\begin{verbatim}
gksu gedit /etc/rc.local
/sbin/iptables -P FORWARD ACCEPT
/sbin/iptables --table nat -A POSTROUTING -o eth1 -j MASQUERADE
\end{verbatim}
Опять изменения вступят в силу только после перезагрузки. Для моментального эффекта:
\begin{verbatim}
sudo iptables -P FORWARD ACCEPT
sudo iptables --table nat -A POSTROUTING -o eth1 -j MASQUERADE
\end{verbatim}
\textbf{Конфигурации клиентской стороны}
Есть два пути конфигурации клиета: вручную и автоматически.
Если производится конфигурация вручсную, то клиентской стороне надо дать IP адрес в сети 10.8.16.0/24(пусть для примера 10.8.16.2), шлюз 10.8.16.1 и DNS сервер компьютера, с которого производится установка (/etc/resolv.conf)

If you have multiple client, or do not want to configure sЕсли же присутствует большое количество серверов, то можно обратиться к DHCP серверу за конфигурациями клиентских машин.
\begin{verbatim}
sudo apt-get install dhcp3-server
\end{verbatim}
Произойдет установка DHCP сервер на компьютер(при этом выйдет ошибка, на которую не надо обращать внимание). Для окончательной конфигурации необходимо добавить еще кое-какую информацию, а именно: необходимо узнать, какие DNS сервера используются что бы далее, через них, настроить клиентские машины. 
\begin{verbatim}
cat /etc/resolv.conf
\end{verbatim}
С помощью этой команды мы получаем IP адрес сервера.Теперь необходимо сконфигурировать DHCP  сервер. Для этого надо:
\begin{verbatim}
gksu gedit /etc/dhcp3/dhcpd.conf
ddns-update-style none;
option domain-name <<mynetwork>>;
option domain-name-servers Nameserver1, Nameserver2;
option routers 10.8.16.1;

default-lease-time 42300;
max-lease-time 84600;
authoritative;

log-facility local7;

subnet 10.8.16.0 netmask 255.255.255.0 {
  range 10.8.16.50 10.8.16.150;
}
\end{verbatim}
Остается определить интерфейс:
\begin{verbatim}
gksu gedit /etc/default/dhcp3-server
INTERFACES="eth0"
sudo /etc/init.d/dhcp3-server start
\end{verbatim}
Сервер работает.\cite{lit5}

\section{Windows}
\label{chap3:sec2}

\textbf{Настройка сервера}

В Windows XP professional или Windows 2000 professional для доступа к Internet внутренней сети используется служба Internet Connection Sharing (далее ICS), или <<Общий доступ к подключению Интернета>>. Эта служба осуществляет поддержку DNS и DHCP (поддержка DHCP происходит только для диапазона адресов 192.168.0.0/24) . Далее рассмотрим настройку сервера по шагам:
\begin{enumerate}
\item Пуск / Настройка/ Сетевые подключения/ (Start / settings / Network connections)Там необходимо выбрать подключение настроенное на Интернет. Если подключение происходит через VPN, то и настраивать общий доступ нужно именно в нем, а не в сетевом подключении.
\item В свойствах подключения во вкладке <<Общие>> есть различные компоненты. Необходимо отключить: <<Клиент для сетей Microsoft>> и <<Службу доступа к файлам и принтерам сетей Microsoft>>. 
\item Во вкладке <<Дополнительно>> (в Windows 2000 professional  вкладка <<Общий доступ>>) запускается служба ICS. (При установленной Windows XP professional SP2 рекомендуется отключить Брандмауэр Windows, в Traffic Inspector для защиты есть сетевой экран (firewall) и вместе они усложнят дальнейшую настройку). Заходим в <<Параметры>>.
\item Надо установить галку <<Разрешить другим пользователям сети использовать подключение к Интернет данного компьютера>>, и снять галку с <<Разрешить другим пользователям сети управлять общим доступом подключения к Интернету>>. Далее --- <<ОК>>. На предупреждение --- тоже <<ОК>>.
\end{enumerate}

\textbf{Настройка клиентской машины}

По умолчанию Windows присваивает внутреннему интерфейсу сервера IP адрес 192.168.0.1, поэтому настраивать клиентские машины можно в диапазоне IP адресов от 192.168.0.2 до 192.168.0.254. 
\begin{enumerate}
\item Пуск / Настройка/ Сетевые подключения/ (Start / settings / Network connections). Надо выбрать подключение, настроенное на локальную сеть. В свойствах этого подключения необходимо выбрать <<Протокол Интернета TCP/IP>>.
\item <<IP-адрес>> - это адрес клиентской машины, который лежит в диапазоне (диапазон адресов зависит от IP адреса сервера) от 192.168.0.2-192.168.0.254  т.е. любой из этих адресов может быть указан (главное чтобы они не повторялись). <<Маска подсети>> --- это еще один идентификатор сети выставляется он автоматически. Главное, чтобы на всех машинах он был одинаковым. <<Основной шлюз>> и <<Предпочитаемый DNS-сервер>> --- здесь указывается IP адрес внутреннего интерфейса сервера (192.168.0.1). Для остальных клиентских машин все настройки те же, меняется только собственный IP адрес.
\end{enumerate}

Настройку клиентских машин можно произвести автоматически, для этого на клиентских машинах  выставите <<Получить IP адрес автоматически>> и <<Получить адрес DNS сервера автоматически>>.

\textbf{Проверка настройки}
Для проверки правильности настройки NAT используется <<Командная строкя>>. Проверку осуществляют на одной клиентской машине(если есть необходимость, можно проверять на всех).
\begin{enumerate}

\item ЗАПУСТИТЬ и надо набрать \begin{verbatim}cmd\end{verbatim} 
\item Пропингуем сначала сервер, находящийся по адресу 192.168.0.1, для этогонеобходимо набрать команду 
\begin{verbatim}ping 192.168.0.1\end{verbatim}. Если пинг прошел, то локальная сеть работает без проблем. Если ответа не произошло: пишет <<Превышен интервал ожидания для запроса>> или <<Заданный узел не доступен>>, тогда надо проверить, лежит ли IP адрес клиента в диапазоне адресов 192.168.0.2-192.168.0.254, что маска подсети у всех одинакова по умолчанию 255.255.255.0, и конечно --- целостность физического подключения.
\item Далее надо пропинговать внешний интерфейс сервера, для этого мы должны знать его адрес. Хорошо если адрес постоянный и он известен знаете, но если нет, то его можно узнать, набрав в командной строке на сервере  \begin{verbatim}ipconfig /all\end{verbatim}. 
\item После этого  можно пропинговать внешний интерфейс сервера. На клиентской машине в командной строке необходимо набрать \begin{verbatim}ping xxx.xxx.xxx.xxx\end{verbatim} где xxx.xxx.xxx.xxx узнанный адрес. Пусть это будет 10.1.1.50. Если все прошло, то связь с внешним интерфейсом установлена. Если ответа не произошло пишет <<Превышен интервал ожидания для запроса>> или <<Заданный узел не доступен>>, тогда необходимо проверить правильность настроек клиента.
\item Далее надо пингануть адрес находящийся в Интернете, например mail.ru. Если пинг проходит, то все настройки верны и на клиентской машине уже есть доступ в Интернет. Если пишет <<mail.ru: неизвестный узел>>, значит неправильно настроен DNS сервер, необходимо проверить настройки у клиентских машин. Если пишет <<Превышен интервал ожидания для запроса.>>, то следует повторить эту проверку на сервере и убедится в правильности настроек подключения к Интернет.

\end{enumerate}
\cite{lit6}

\section{OpenBSD}
\label{chap3:sec3}
%правило
Основной формат правил NAT в pf.conf выглядит как: 
\begin{verbatim}
nat [pass] [log] on interface [af] from src_addr [port src_port] 
\end{verbatim}
\begin{verbatim}
to dst_addr [port dst_port] -> ext_addr [pool_type] [static-port] 
\end{verbatim}
% таблица с пояснениями
\begin{longtable}{p{0.2\textwidth}p{0.7\textwidth}}
Команда & Значение \\
nat  & ключевое слово, с которого начинается правило NAT \\
pass & преобразованные пакеты не будут обрабатываются правилами фильтрации \\
log & логировать пакеты с помощью pflogd. Обычно только первый пакет заносится в журнал. Для логирования всех пакетов используйте log (all). \\
interface & Название интерфейса, или группы интерфейсов на котором будут проводиться преобразования. \\
af & Семейство адресов, inet для IPv4 или inet6 для IPv6. PF как правило в сам в состоянии определить этот параметр c помощью исходных адресов и адресов назначения. \\
src\_addr & Исходные (внутренние) адреса пакетов, которые будут преобразованы. Исходные адреса могут быть указаны, как: 
\begin{itemize}
\item Единственный IPv4 или IPv6 адрес. 
\item Сетевой блок CIDR 
\item Полное доменное имя, которое будет преобразовано через DNS сервер при загрузке правила. Полученные адреса окажутся в правиле. 
\item Название сетевого интерфейса или группы сетевых интерфейсов. Любые IP адреса принадлежащие интерфейсу будут подставлены в правило, во время загрузки. 
\item Название сетевого интерфейса сопровождающегося /netmask (например, /24). Каждый IP адрес на интерфейсе, совмещённый с сетевой маской, образует блок CIDR и оказывается в правиле. 
\item Название сетевого интерфейса или группы сетевых интерфейсов, сопровождающихся модификаторами: 
\begin{itemize}
\item :network - заменяется сетевым блоком CIDR (например, 192.168.0.0/24) 
\item :broadcast - заменяется широковещательным адресом сети (например, 192.168.0.255) 
\item :peer - заменяется peer IP -- адресом другой стороны point-to-point линка 
\end{itemize}
\end{itemize} \\
src\_port & Исходный порт в заголовке пакета. Порты могут быть указаны, как: 
\begin{itemize}
\item Номер от 1 до 65535 
\item Актуальное название сервиса смотрите в /etc/services 
\item Набор портов, используя списки 
\item Диапазон: 
\begin{itemize}
\item != (не равно) 
\item < (меньше) 
\item > (больше) 
\item <= (меньше или равно) 
\item >= (больше или равно) 
\item >< (диапазон) 
\item <> (обратный диапазон) 
\end{itemize} 
\end{itemize}
Последние два бинарных оператора (они используют два аргумента) не включают аргументы в этот диапазон 
: (включающий диапазон) 
Включающий диапазон, также бинарные операторы и включают аргументы в диапазон. 
Опция port не часто используется в nat правилах, потому что обычно стоит задача преобразовывать весь трафик, не зависимо от используемых портов. \\

dst\_addr  & Адрес назначения преобразуемых пакетов. Адрес назначения указывается так же, как и исходный адрес.  \\
dst\_port & Порт назначения. Порт указывается так же, как и исходный порт.  \\
ext\_addr  & Внешний (преобразуемый) адрес на NAT шлюзе, в который будут пробразованы пакеты. Внешний адрес может быть указан как: 
\begin{itemize}
\item Единственный IPv4 или IPv6 адрес. 
\item Сетевой блок CIDR 
\item Полное доменное имя, которое будет преобразовано через DNS сервер при загрузке правила. Полученные адреса окажутся в правиле. 
\item Название сетевого интерфейса. Любые IP адреса принадлежащие интерфейсу будут подставлены в правило, во время загрузки. 
\item Название сетевого интерфейса указанного в круглых скобках ( ). Это говорит PF обновлять правило, если IP адрес(а) на указанном интерфейсе сменился. Полезно на интерфейсах, которые получают IP адреса по DHCP или используют dial-up, чтобы каждый раз при смене адреса не перегружать правила. 
\item Название сетевого интерфейса, сопровождающееся одним из этих модификаторов: 
\begin{itemize}
\item :network - заменяется сетевым блоком CIDR (например, 192.168.0.0/24) 
\item :peer - заменяется peer IP адресом другой стороны point-to-point линка 
\end{itemize}
\end{itemize}
Кроме того, модификатор :0 может быть добавлен к любому интерфейсу или к любому из вышеуказанных модификаторов, для указания, что PF не должен задействовать alias IP адреса. Этот модификатор может использоваться при указании интерфейса в круглых скобках. Пример: fxp0:network:0 
Ряд адресов, используя список. \\
pool\_type & Указывается тип диапазона адресов используемого для трансляции. \\
static-port & Не преобразовывать исходные порты в TCP и UDP пакетах. \\
\end{longtable}


Как правило, для большинства случаев подойдёт следующее: 
\begin{verbatim}
nat on tl0 from 192.168.1.0/24 to any -> 24.5.0.5
\end{verbatim}
Эти правила говорят выполнять NAT на интерфейсе tl0 для любых входящих пакетов из 192.168.1.0/24 и заменять исходный IP адрес на 24.5.0.5. 
Вышеуказанное правило является корректны однако лучше использовать:
\begin{verbatim} nat on tl0 from dc0:network to any -> tl0  \end{verbatim}. 
Это объясняется тем, что есть возможность поменять IP адреса на любом интерфейсе без изменения правила. 
Когда указывается название интерфейса для трансляции адресов, как в примере выше, то IP адрес определяется в pf.conf во время загрузки, а не на <<лету>>. Если используется DHCP для настройки внешних интерфейсов, это может оказаться проблемой. Если присваиваемые IP адреса меняются, NAT будет продолжать преобразовывать исходящие пакеты используя старый IP адрес. Это приведёт к остановке функционирования исходящих соединений. Чтобы этого избежать,  можно сделать так, что бы PF автоматически обновлять преобразуемый адрес, указав круглые скобки вокруг названия интерфейса: 
nat on tl0 from dc0:network to any -> (tl0) 
Этот метод работает для преобразования IPv4 и IPv6 адресов. 

\textbf{Двунаправленное отображение (отображение 1:1)}
Двунаправленное отображение может быть установлено использованием правила binat. Правило binat устанавливает один к одному отображение между внутренним IP адресом и внешним. Это может быть полезно, например, для предоставления веб сервера во внутренней сети со своим личным внешним IP адресом. Соединения из Интернета на внешний адрес будут транслироваться на внутренний адрес а соединения от веб сервера (такие как DNS запрос) будут преобразовываться во внешний адрес. TCP и UDP порты никогда не изменяются с binat правилом. 
\begin{verbatim}
binat on tl0 from \$web\_serv\_int to any -> \$web\_serv\_ext
\end{verbatim}

\textbf{Исключения правил трансляции}
Исключения в правилах трансляции могут быть сделаны используя ключевое слово no. Например, если изменить пример указанный выше, то он будет выглядеть так: 
\begin{verbatim}
no nat on tl0 from 192.168.1.208 to any
nat on tl0 from 192.168.1.0/24 to any -> 24.2.74.79 
\end{verbatim}
Тогда указанная сеть 192.168.1.0/24 будет транслироваться через внешний адрес 24.2.74.79, за исключением адреса 192.168.1.208. 
Если существует ключевое слово no тогда пакеты не транслируются. Ключевое слово no так же может быть использовано с binat и rdr правилами. 

\textbf{Проверка NAT статуса}
Для просмотра активных NAT трансляций используется pfctl с опцией -s state. Эта опция выведет список всех текущих NAT сессий: 
\begin{verbatim}
# pfctl -s state
fxp0 TCP 192.168.1.35:2132 -> 24.5.0.5:53136 -> 65.42.33.245:22 
\end{verbatim}
\begin{verbatim}TIME_WAIT:TIME_WAIT \end{verbatim}
fxp0 UDP 192.168.1.35:2491 -> 24.5.0.5:60527 -> 24.2.68.33:53 
\begin{verbatim}MULTIPLE:SINGLE\end{verbatim}

\begin{longtable}{p{0.2\textwidth}p{0.7\textwidth}}
Запись & Пояснение\\
fxp0 & Отображает интерфейс к которому привязан стейт. Слово self будет отображаться если стейт плавающий floating. \\
TCP & используемый соединением протокол. \\
192.168.1.35: 2132  & IP адрес (192.168.1.35) машины во внутренней сети. Исходный порт (2132) показан после адреса. Также адрес, который находится в IP заголовке. \\
24.5.0.5:53136 & IP адрес (24.5.0.5) и порт (53136) на шлюзе, в который будут транслированы пакеты. \\
65.42.33.245:22 & IP адрес (65.42.33.245) и порт (22) к которому внутренняя машина соединяется. \\
TIME\_WAIT: TIME\_WAIT & Показывает в каком состоянии прибывает TCP соединение \\
\end{longtable}
\cite{lit2}


%%% Local Variables:
%%% mode: latex
%%% coding: utf-8-unix
%%% TeX-master: "../default"
%%% End:
